package com.powernode.listener;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.powernode.constant.QueueConstant;
import com.powernode.domain.Order;
import com.powernode.service.OrderService;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.IOException;

/**
 * 内容:
 * 作者: cy
 */
@Component
@Slf4j
public class OrderListener {


    @Autowired
    private OrderService orderService;

    /**
     * 监听订单未支付的回滚操作
     * 1.拿到订单号 去查数据库
     * 2.判断状态
     * 3.如果支付了 就签收 return
     * 4.如果没有支付 得会查一次支付平台 从而判断到底有无支付
     * 5.如果真的没有支付  库存需要回滚  订单表状态需要修改
     *
     * @param message
     * @param channel
     */
    @RabbitListener(queues = QueueConstant.ORDER_DEAD_QUEUE)
    public void handlerOrderDeadMsg(Message message, Channel channel) {
        String orderSn = new String(message.getBody());
        System.out.println(orderSn);
        // 拿到订单号 去查数据库
        Order order = orderService.getOne(new LambdaQueryWrapper<Order>()
                .eq(Order::getOrderNumber, orderSn)
        );
        if (order.getIsPayed()) {
            // 说明支付了
            try {
                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }
        // 说明状态没有改变 可能是没有支付 也可能是支付平台回调我（通知我出现了问题）
        // TODO 这里需要去会查支付平台

        // 得回滚操作了
        try {
            orderService.orderRollback(order);
            try {
                channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        } catch (Exception e) {
            log.error("回滚失败，人工处理，订单号为{}",orderSn);
        }
    }

}
